from Data import DataType, DataManager
from TackGameEvents import SteeringRequestEvent

################################################################################
class SteeringManager(DataType):
    """
    Manager class for Steering classes, different Steering Behaviour objects can 
        be added to the Manager and it will return the combined Steering Force 
    """
    ############################################################################
    def __init__(self):
        DataType.__init__(self, ['xml'])
        # Dictionary containing list of currently managed behaviours
        #    each entry consists of a further dictionary with the following
        #    entries :
        #        oObject - the instance of the SteeringBehaviour Class
        #        bActive - the Behaviours active status
        #        nWeight - Priority Weight that this behvaiour has been assigned
        self._dBehaviours = {}
    ############################################################################
    
    ############################################################################
    def CalculateForce(self):
        """
        Returns the combined steering force of the Managers Behaviours
        """
        pass
    ############################################################################
    
    ############################################################################
    def AddBehaviour(self, oBehaviour, nWeight, bActive=True):
        """
        Adds an additional Steering Behaviour to the Manager
        
        param - oBehaviour : ref to SteeringBehaviour object
        param - nWeight : Priority Weight for object
        param - bActive : (default = True) initial 'active' setting
        """
        self._dBehaviours[oBehaviour.__class__.__name__] = {
          'oObject' : oBehaviour,
          'bActive' : bActive,
          'nWeight' : nWeight,
        }
    ############################################################################
    
    ############################################################################
    def ActivateBehaviour(self, cClass):
        """
        Activates an already added Steering Behaviour
        
        param - cClass : Class instance to activate
        """
        sName = cClass.__name__
        assert self._dBehaviours.has_key(sName), "Unknown Steering class: " + sName
        self._dBehaviours[sName]['bActive'] = 1
    ############################################################################
    
    ############################################################################
    def DeactivateBehaviour(self, cClass):
        """
        Deactivates an already added Steering Behaviour
        
        cClass - Class instance to activate
        """
        sName = cClass.__name__
        assert self._dBehaviours.has_key(sName), "Unknown Steering class: " + sName
        self._dBehaviours[sName]['bActive'] = 0
    ############################################################################
################################################################################

################################################################################
class SteeringBehaviour():
    """
    Virtual Base class for all SteeringBehaviour classes
    """
    
    ############################################################################
    def CalculateForce(self, oSteerable):
        """
        Virtual Method that returns the calculated force for this behaviour
        
        param - oSteerable : Client object that implements ISteerable Interface 
        
        return - oForce : Vector representing directive force
        """
        pass
    ############################################################################
################################################################################

################################################################################
class SteeringManagerManager(DataManager):
    """
    Manages different collections of steering behaviours
    """
    ############################################################################
    def __init__(self):
        DataManager.__init__(self, SteeringManager, SteeringRequestEvent)
    ############################################################################
    
    ############################################################################
    def DataLoad(self, oEvent):
        pass
    ############################################################################
################################################################################

################################################################################
class ISteerable():
    """
    Interface for Objects that can be steered by Steering Behaviours
    """
    pass
################################################################################